package state;

/**
 * 如果一个类的方法要根据它状态不同做出的反应也不同，需要状态模式。
 *
 * 如果要根据状态在方法里面都需要switch
 *
 * 例如
 * tcp
 *   open()
 *   close()
 *   gz()
 * 方法是不会扩展的但是状态是会扩展的。
 * 在网络不同的状态下他们的表现也是有同的表现的这时候可以用 State 状态模式
 * 比如 listen状态 open是什么表现
 *     close状态  openxxx
 *
 * 注意不要在方法上扩展要在状态上扩展。
 * 如果state不扩展就用switch就行了
 */
public class State {
    public static void main(String args[]){
        System.out.println("state");

        Ms ms = new Ms();
        ms.performance = new Happy(); // 给个happy的状态

        ms.cry();
        ms.say();
        ms.smile();
    }
}


// 方式一
class MM{

    private enum MMState {Happy,Sad}
    MMState mmState;

    void smile(){
        // switch mmState
        switch (mmState.Happy){
            // 状态是高兴的时候 微笑是什么样的
            // 在悲伤的时候微笑是什么样的。
        }
    }

    void cry(){
        // switch mmState
    }

    void say(){
        // switch mmState
    }

}


// 方式二 把状态需要调用的方法定义为抽象方法。
abstract class Performance{
    abstract void smile();
    abstract void cry();
    abstract void say();
}

// 状态去实现对应的方法
class Happy extends Performance{

    @Override
    void smile() {
        System.out.println("happy-smile");
    }

    @Override
    void cry() {
        System.out.println("happy-cry");
    }

    @Override
    void say() {
        System.out.println("happy-say");
    }
}


class Ms{
    Performance performance;
    void smile(){
        performance.smile();
    }
    void cry(){
        performance.cry();
    }
    void say(){
        performance.say();
    }
}